/*
 *所有关于Position类的业务代码应在此处编写
*可使用repository.调用常用方法，获取EF/Dapper等信息
*如果需要事务请使用repository.DbContextBeginTransaction
*也可使用DBServerProvider.手动获取数据库相关信息
*用户信息、权限、角色等使用UserContext.Current操作
*PositionService对增、删、改查、导入、导出、审核业务代码扩展参照ServiceFunFilter
*/
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
using System.Linq;
using System.Linq.Expressions;
using System.Net;
using System.Security.Claims;
using VOL.Core.BaseProvider;
using VOL.Core.DBManager;
using VOL.Core.Extensions;
using VOL.Core.Extensions.AutofacManager;
using VOL.Core.ManageUser;
using VOL.Core.Utilities;
using VOL.demo.IRepositories;
using VOL.Entity.DomainModels;

namespace VOL.demo.Services
{
    public partial class PositionService
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
        private readonly IPositionRepository _repository;

        [ActivatorUtilitiesConstructor]
        public PositionService(
            IPositionRepository dbRepository,
            IHttpContextAccessor httpContextAccessor
        ) : base(dbRepository)
        {
            _httpContextAccessor = httpContextAccessor;
            _repository = dbRepository;
            // 多租户初始化（按需保留）
            // base.Init(dbRepository);
        }

        public override WebResponseContent Add(SaveModel saveDataModel)
        {
            WebResponseContent webResponse = new WebResponseContent();

            // 1. 预处理数据：补充必填字段默认值
            saveDataModel.MainData["Status"] ??= 1; // 状态默认启用
            saveDataModel.MainData["CreateTime"] = DateTime.Now;
            saveDataModel.MainData["UpdateTime"] = DateTime.Now;
            saveDataModel.MainData["OrgId"] ??= null; // 组织ID为空时设为null

            // 2. 保存前校验（核心业务规则）
            base.AddOnExecuting = (Position position, object list) =>
            {
                // 校验岗位编号唯一性（改用SqlSugar原生查询语法）
                bool codeExists = _repository.DbContext.Queryable<Position>()
                    .Any(p => p.PosCode == position.PosCode );
                if (codeExists)
                {
                    return webResponse.Error($"岗位编号【{position.PosCode}】已存在，请更换");
                }

                // 校验岗位名称非空
                if (string.IsNullOrWhiteSpace(position.PosName))
                {
                    return webResponse.Error("岗位名称不能为空");
                }

                // 校验状态合法性
                if (position.Status != 0 && position.Status != 1)
                {
                    return webResponse.Error("岗位状态只能是0（停用）或1（启用）");
                }

                return webResponse.OK();
            };

            // 3. 保存后操作（事务内逻辑）
            base.AddOnExecuted = (Position position, object list) =>
            {
                // 可选：更新操作时间为最新
                position.UpdateTime = DateTime.Now;
                _repository.Update(position);

                return webResponse.OK($"岗位【{position.PosName}】创建成功，ID：{position.Id}");
            };

            // 4. 执行基类保存（内置事务）
            return base.Add(saveDataModel);
        }

        public override WebResponseContent Del(object[] keys, bool delList = false)
        {
            WebResponseContent webResponse = new WebResponseContent();

            base.DelOnExecuting = (object[] ids) =>
            {
                // 权限校验：仅超级管理员可删除岗位（简化逻辑，适配项目实际）
                if (!UserContext.Current.IsSuperAdmin)
                {
                    return webResponse.Error("无权限删除岗位");
                }
                return webResponse.OK();
            };

            base.DelOnExecuted = (object[] positionIds) =>
            {
                // 清除岗位缓存（示例）
                var cacheKeys = positionIds.Select(x => $"Position:{x.GetInt()}").ToArray();
                base.CacheContext.RemoveAll(cacheKeys);
                return webResponse.OK("岗位删除成功");
            };

            return base.Del(keys, delList);
        }
        public override WebResponseContent Update(SaveModel saveModel)
        {
            WebResponseContent webResponse = new WebResponseContent();

            // 预处理：禁止修改岗位编号
            if (saveModel.MainData.ContainsKey("PosCode"))
            {
                saveModel.MainData.Remove("PosCode");
                webResponse.Error("岗位编号不允许修改，已自动过滤该字段");
            }

            base.UpdateOnExecuting = (Position position, object obj1, object obj2, List<object> list) =>
            {
                // 业务校验1：岗位名称非空
                if (string.IsNullOrWhiteSpace(position.PosName))
                {
                    return webResponse.Error("岗位名称不能为空");
                }

                // 业务校验2：岗位状态合法性
                if (position.Status != 0 && position.Status != 1)
                {
                    return webResponse.Error("岗位状态只能是0（停用）或1（启用）");
                }

                // 业务校验3：岗位编号唯一性（修改时排除自身）
                bool codeExists = _repository.DbContext.Queryable<Position>()
                    .Where(p => p.PosCode == position.PosCode && p.Id != position.Id)
                    .Any();
                if (codeExists)
                {
                    return webResponse.Error($"岗位编号【{position.PosCode}】已存在，请更换");
                }

                return webResponse.OK();
            };

            base.UpdateOnExecuted = (Position position, object obj1, object obj2, List<object> list) =>
            {
                // 清除岗位缓存
                base.CacheContext.Remove($"Position:{position.Id}");
                return new WebResponseContent { Status = true, Message = $"岗位【{position.PosName}】修改成功" };
            };

            return base.Update(saveModel);
        }
    }
}
